package simulador.entidade;
import simulador.comum.Definicoes;
import eduni.simjava.Sim_entity;
import eduni.simjava.Sim_event;
import eduni.simjava.Sim_port;
import eduni.simjava.Sim_stat;
import eduni.simjava.Sim_system;
import eduni.simjava.distributions.Sim_negexp_obj;

/**
 * 
 * @author Gustavo Farias, Erick Moreno, Vinicius Marques, Magno Jefferson.
 *
 */
public class ServicoMatricula extends Sim_entity {
	
	private static final String DELAY = "DelayServer";
	
	//TODO PEGAR DA CONFIGURACAO
	private static final double PROB_AJUSTE = 0.3;
	
	private Sim_port in;
	
	private Sim_port out;

	private Sim_negexp_obj delay;

	private Sim_stat stat; 

	public ServicoMatricula(String name, double mean) {
		super(name);
		
		in = new Sim_port(Definicoes.PORTA_ENTRADA_MATRICULA); 
		add_port(in);
		
		out = new Sim_port(Definicoes.PORTA_SAIDA_MATRICULA); 
		add_port(out);
		
		delay = new Sim_negexp_obj(DELAY, mean);
		
		add_generator(delay);
		
		stat = new Sim_stat();
		stat.add_measure(Sim_stat.UTILISATION);
		stat.add_measure(Sim_stat.SERVICE_TIME);
		stat.add_measure(Sim_stat.INTERVAL_BASED);
		stat.add_measure(Sim_stat.WAITING_TIME);
		set_stat(stat);
	}

	public void body() {
		
		int totalAjustes = 0;
		int totalResolvidoSemAjuste = 0;
		while (Sim_system.running()) {
			Sim_event e = new Sim_event();
			sim_get_next(e);
			
			double numeroAleatorio = Math.random(); // gerar numero entre 0 e 1.
			double tempoProcessamento = delay.sample(); // tempo de processamento gerado aleatoriamente.
			
			// supondo que a probabilidade de o aluno ir pra ajuste eh de 30%
			
			sim_process(tempoProcessamento); // tenta matricular aluno.
			if(numeroAleatorio <= PROB_AJUSTE){
				totalAjustes++;
				sim_schedule(out, 0.0, Definicoes.AJUSTE); // manda pra ServicoAjuste
			} else {
				totalResolvidoSemAjuste++;
			}
			
			sim_completed(e); // evento resolvido
		}
		System.out.println("Total de fregueses pra ajuste: " + totalAjustes);
		System.out.println("Total de fregueses resolvidos sem ajuste: " + totalResolvidoSemAjuste);
		totalAjustes = 0;
		totalResolvidoSemAjuste = 0;
	}
}